﻿using System;
using System.Collections.Generic;

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CNVP.Framework.Utils;
using CNVP.Config;
using CNVP.JShop.UI;
using System.Data;
using PayWayAPI.TenPayWay;
using PayWayAPI.AliPayWay;

namespace CNVP.JShop.Web.Member
{
    public partial class OrderPay : UserPage
    {
        string oid = "";
        protected void Page_Load(object sender, EventArgs e)
        {
            oid = Request.QueryString["oid"];
            if (string.IsNullOrEmpty(oid) || !Public.IsNumber(oid))
            {
                oid = "0";
            }
            if (!IsPostBack)
            {
                if (int.Parse(oid) > 0)
                {
                    var model = new BLL.CNVP_Order().GetSingle_CNVP_OrderById(int.Parse(oid));
                    if (model != null)
                    {
                        txtPrice.Text = model.OrderTotalAmount.ToString();
                        txtOrderNum.Text = model.OrderNum;
                        ViewState["PayWay"] = model.PayWay;
                        txtPrice.ReadOnly = true;
                        txtOrderNum.ReadOnly = true;
                        GetPayWay();
                    }
                }
            }
        }
        protected void GetPayWay()
        {
            List<Model.CNVP_Column> dt = new BLL.CNVP_Column().GetAll_CNVP_Column("ColumnType in(5,7)");
            foreach (Model.CNVP_Column model in dt)
            {
                ListItem l = new ListItem(model.ColumnName, model.ID.ToString());

                if (Convert.ToString(ViewState["PayWay"]) == model.ID.ToString())
                {
                    l.Selected = true;
                }
                brlPayWay.Items.Add(l);
            }

        }
        protected void ImgBut1_Click(object sender, ImageClickEventArgs e)
        {
            if (txtPrice.Text.Trim() == "")
            {
                MessageUtils.ShowPre("支付金额不能为空！");
                return;
            }
            if (txtOrderNum.Text.Trim() == "")
            {
                MessageUtils.ShowPre("涉及定单不能为空！");
                return;
            }
            var model = new BLL.CNVP_Order().GetSingle_CNVP_OrderById(int.Parse(oid));
            if (model != null)
            {
                if (txtPrice.Text.Trim() == model.OrderTotalAmount.ToString())
                {
                    switch (brlPayWay.SelectedValue)
                    {
                        case "30":
                            var model_alipay = new BLL.CNVP_Column().GetSingle_CNVP_ColumnById(30);//  ID=30 是支付宝
                            if (model_alipay.AlipayInInterfaceType.ToString() == "0")
                            {
                                alipay();//即时到账接口
                            }
                            else
                            {
                                alipayDB();//支付宝双功能（担保、即时）接口或担保交易接口
                            }
                            break;
                        case "31":
                            var model_tenpay = new BLL.CNVP_Column().GetSingle_CNVP_ColumnById(31);//  ID=31 是财富通
                            if (model_tenpay.AlipayInInterfaceType.ToString() == "0")
                            {
                                TenPay();//即时交易
                            }
                            else
                            {
                                TenPayDB();//担保交易
                            }
                            break;
                        case "103":
                            CashOnDelivery();//货到付款
                            break;
                        default:
                            alipayDB();//支付宝双功能（担保、即时）接口或担保交易接口
                            break;

                    }
                }
            }
            else
            {
                alipayDB();//支付宝双功能（担保、即时）接口或担保交易接口
            }

        }
        #region "货到付款支付方式"
        private void CashOnDelivery()
        {
            Model.CNVP_Order model = new Model.CNVP_Order();
            model.OrderNum = txtOrderNum.Text.Trim();
            model.OrderState = 1;//JShop系统更新为‘准备发货(到付或已付)’
            model.PayWay = "103";
            new BLL.CNVP_Order().UpdateOrderStateByNo(model);
            Response.Redirect("OrderList.aspx",true);
        }
        #endregion
        #region 支付宝
        /// <summary>
        /// 支付宝即时到账接口
        /// </summary>
        private void alipay()
        {
            var model = new BLL.CNVP_Column().GetSingle_CNVP_ColumnById(30);
            //业务参数赋值；
            string gateway = "https://www.alipay.com/cooperate/gateway.do?";	//支付接口
            string service = "create_direct_pay_by_user";                       //服务名称，这个是识别是何接口实现何功能的标识，请勿修改

            string seller_email = model.PayAccountNumber;			            //商家签约时的支付宝帐号，即收款的支付宝帐号
            string sign_type = "MD5";                                           //加密类型,签名方式“不用改”
            string key = model.PayKey;                    //安全校验码，与partner是一组，获取方式是：用签约时支付宝帐号登陆支付宝网站www.alipay.com，在商家服务我的商家里即可查到。
            string partner = model.PayParterID;            //商户ID，合作身份者ID，合作伙伴ID
            string _input_charset = "utf-8";                                    //编码类型，完全根据客户自身的项目的编码格式而定，千万不要填错。否则极其容易造成MD5加密错误。

            string show_url = UIConfig.SiteDomain + "/member/OrderList.aspx";  	//展示地址，即在支付页面时，商品名称旁边的“详情”的链接地址,不允许加?id=123这类自定义参数。

            string out_trade_no = txtOrderNum.Text.Trim();                          //客户自己的订单号，订单号必须在自身订单系统中保持唯一性
            string subject = txtOrderNum.Text.Trim();              //商品名称
            string body = "订单" + txtOrderNum.Text.Trim() + "支付" + txtPrice.Text.Trim() + "元";        //商品描述
            string total_fee = txtPrice.Text.Trim();						        //商品价格，也可称为订单的总金额

            //服务器通知url（Alipay_Notify.aspx文件所在路经），必须是完整的路径地址
            string notify_url = UIConfig.SiteDomain + "/member/Alipay_Notify.aspx";
            //服务器返回url（Alipay_Return.aspx文件所在路经），必须是完整的路径地址
            string return_url = UIConfig.SiteDomain + "/member/Alipay_Return.aspx";

            //构造数组；
            //以下数组即是参与加密的参数，若参数的值不允许为空，若该参数为空，则不要成为该数组的元素
            string[] para ={
							   "service="+service,
							   "partner=" + partner,
							   "seller_email=" + seller_email,
							   "out_trade_no=" + out_trade_no,
							   "subject=" + subject,
							   "body=" + body,
							   "total_fee=" + total_fee, 
							   "show_url=" + show_url,
							   "payment_type=1",
							   "notify_url=" + notify_url,
							   "return_url=" + return_url,
							   "_input_charset="+_input_charset
						   };

            //支付URL生成
            string aliay_url = AliPay.CreatUrl(
                gateway,//GET方式传递参数时请去掉注释
                para,
                _input_charset,
                sign_type,
                key
                );

            //以下是GET方式传递参数
            Response.Redirect(aliay_url);
        }

        /// <summary>
        /// 支付宝双功能（担保、即时）接口或担保交易接口
        /// </summary>
        private void alipayDB()
        {
            var model = new BLL.CNVP_Column().GetSingle_CNVP_ColumnById(30);//  ID=30 是支付宝
            if (model != null)
            {
                string gateway = "https://www.alipay.com/cooperate/gateway.do?";	//支付接口
                string service = "";
                if (model.AlipayInInterfaceType.ToString() == "1")
                {
                    service = "create_partner_trade_by_buyer";                   //担保交易,服务名称
                }
                else if (model.AlipayInInterfaceType.ToString() == "2")
                {
                    service = "trade_create_by_buyer";                           //支付宝双功能（担保、即时）,服务名称
                }
                else
                {
                    service = "create_partner_trade_by_buyer";                   //担保交易,服务名称
                }
                string seller_email = model.PayAccountNumber;			                //卖家帐号
                string sign_type = "MD5";                                           //加密类型,签名方式“不用改”
                string key = model.PayKey;                   //安全校验码
                string partner = model.PayParterID;           //商户ID，合作ID
                string _input_charset = "utf-8";                                    //编码类型

                string show_url = UIConfig.SiteDomain + "/member/OrderList.aspx";                      //展示地址,不允许加?id=123这类自定义参数

                string out_trade_no = txtOrderNum.Text.Trim();                          //客户网站订单号，（现取系统时间，可改成网站自己的变量）
                string subject = txtOrderNum.Text.Trim();              //商品名称
                string body = "订单" + txtOrderNum.Text.Trim() + "支付" + txtPrice.Text.Trim() + "元";        //商品描述
                string price = txtPrice.Text.Trim();		                            //商品价格
                string quantity = "1";				                                //商品数量

                string logistics_type = "EXPRESS";                                  //物流配送方式：POST(平邮)、EMS(EMS)、EXPRESS(其他快递)
                string logistics_fee = "0";									        //物流配送费用
                string logistics_payment = "SELLER_PAY";                            //物流配送费用付款方式：SELLER_PAY(卖家支付)、BUYER_PAY(买家支付)、BUYER_PAY_AFTER_RECEIVE(货到付款)

                ////服务器通知url（Alipay_Notify.asp文件所在路经）
                string notify_url = UIConfig.SiteDomain + "/member/Alipay_Notify.aspx";
                //服务器返回url（return_Alipay_Notify.asp文件所在路经）
                string return_url = UIConfig.SiteDomain + "/member/Alipay_Return.aspx";
                //相关参数名称具体含义，可以在支付宝接口服务文档中查询到，
                //以上两个文件，通知正常都可以在notify data目录找到通知过来的日志

                string aliay_url = AliPay.CreatUrl(
                    gateway,
                    service,
                    partner,
                    sign_type,
                    out_trade_no,
                    subject,
                    body,
                    price,
                    show_url,
                    seller_email,
                    key,
                    return_url,
                    _input_charset,
                    notify_url,
                    logistics_type,
                    logistics_fee,
                    logistics_payment,
                    quantity
                    );

                //以下是GET方式传递参数
                Response.Redirect(aliay_url);
            }
        }

        #endregion

        #region 财富通
        private void TenPay()
        {
            var model = new BLL.CNVP_Column().GetSingle_CNVP_ColumnById(31);//  ID=31 是财富通
            if (model != null)
            {
                //商户号
                string bargainor_id = model.PayParterID.Trim();

                //密钥
                string key = model.PayKey.Trim();

                //商户订单号，不超过32位，财付通只做记录，不保证唯一性
                string sp_billno = txtOrderNum.Text.Trim();

                //当前时间 yyyyMMdd
                string date = DateTime.Now.ToString("yyyyMMdd");

                //生成订单10位序列号，此处用时间和随机数生成，商户根据自己调整，保证唯一
                string strReq = "" + DateTime.Now.ToString("HHmmss") + TenpayUtil.BuildRandomStr(4);

                //财付通订单号，10位商户号+8位日期+10位序列号，需保证全局唯一
                string transaction_id = bargainor_id + date + strReq;
                string return_url = UIConfig.SiteDomain + "/member/Tenpay_Return_Immediate.aspx";

                //创建PayRequestHandler实例
                PayRequestHandler reqHandler = new PayRequestHandler(Context);

                //设置密钥
                reqHandler.setKey(key);

                //初始化
                reqHandler.init();

                //-----------------------------
                //设置支付参数
                int price = Convert.ToInt32(Convert.ToDecimal(txtPrice.Text.Trim()) * 100);		              //商品价格
                //-----------------------------
                reqHandler.setParameter("bargainor_id", bargainor_id);			//商户号
                reqHandler.setParameter("sp_billno", sp_billno);				//商家订单号
                reqHandler.setParameter("transaction_id", transaction_id);		//财付通交易单号
                reqHandler.setParameter("return_url", return_url);				//支付通知url
                reqHandler.setParameter("desc", "订单号：" + transaction_id);	//商品名称
                reqHandler.setParameter("total_fee", price.ToString());			//商品金额,以分为单位
                //用户ip,测试环境时不要加这个ip参数，正式环境再加此参数
                reqHandler.setParameter("spbill_create_ip", Page.Request.UserHostAddress);

                //获取请求带参数的url
                string requestUrl = reqHandler.getRequestURL();
                Response.Redirect(requestUrl);
            }

        }

        /// <summary>
        /// 财富通担保接口
        /// </summary>
        private void TenPayDB()
        {
            var model = new BLL.CNVP_Column().GetSingle_CNVP_ColumnById(31);//  ID=31 是财富通
            if (model != null)
            {
                //平台商户号
                string chnid = model.PayAccountNumber.Trim();

                //卖家商户号
                string seller = model.PayParterID.Trim();

                //密钥
                string key = model.PayKey;


                //生成订单10位序列号，此处用时间和随机数生成，商户根据自己调整，保证唯一
                string strReq = txtOrderNum.Text.Trim();

                //商户订单号，不超过32位，财付通只做记录，不保证唯一性
                string mch_vno = strReq;

                //商户回调url
                string mch_returl = UIConfig.SiteDomain + "/member/Tenpay_Return.aspx";

                //支付结果通知页面
                string show_url = UIConfig.SiteDomain + "/member/Tenpay_Notify.aspx";

                //创建MediPayRequestHandler实例
                MediPayRequest reqHandler = new MediPayRequest(Context);

                //设置密钥
                reqHandler.setKey(key);

                //初始化
                reqHandler.init();

                //-----------------------------
                //设置支付参数
                string subject = txtOrderNum.Text.Trim();                                                     //商品名称
                string body = "" + UIConfig.SiteName + "订单" + txtOrderNum.Text.Trim() + "支付" + txtPrice.Text.Trim() + "元";        //商品描述
                int price = Convert.ToInt32(Convert.ToDecimal(txtPrice.Text.Trim()) * 100);		              //商品价格
                //-----------------------------
                reqHandler.setParameter("chnid", chnid);				//平台商户号
                reqHandler.setParameter("seller", seller);				//卖家商户号
                reqHandler.setParameter("mch_vno", mch_vno);				//商家订单号
                reqHandler.setParameter("mch_returl", mch_returl);		//支付通知url
                reqHandler.setParameter("show_url", show_url);			//支付结果显示页面
                reqHandler.setParameter("mch_name", subject);			//商品名称
                reqHandler.setParameter("mch_desc", body);		        //交易说明
                reqHandler.setParameter("mch_price", price.ToString());				//商品金额,以分为单位'勿：0.01'
                reqHandler.setParameter("encode_type", "1");				//编码类型：1,gb2312 2,utf-8
                reqHandler.setParameter("transport_desc", "EXPRESS");	        //物流配送方式：POST(平邮)、EMS(EMS)、EXPRESS(其他快递)
                reqHandler.setParameter("transport_fee", "0");			//物流费用
                reqHandler.setParameter("need_buyerinfo", "1");			//是否需要在财付通填定物流信息，1：需要，2：不需要
                reqHandler.setParameter("mch_type", "1");				//交易类型：1、实物交易，2、虚拟交易
                reqHandler.setParameter("attach", "");				//商户自定义参数
                //获取请求带参数的url
                string requestUrl = reqHandler.getRequestURL();
                Response.Redirect(requestUrl);
            }
        }

        #endregion
    }
}